zxt.cfg.TabPage = {
	CSSScroll$Iframe: "auto"
};

/**
 * @private
 * @class TAB页面
 */
zxt.ui.TabPage = function(label, title, dom, closeable) {
	this._label = label;
	this._title = title || label;
	this._titleLi = null;	
	this._dom = $(dom);
	if((closeable=="false")||(closeable==false)){
		this._closeable = false;
	}else{
		this._closeable = true;
	};	
};

zxt.ui.TabPage.prototype.dom = function(){
	return this._dom.get(0);
};	

/**
 * @class TAB组件
 */
zxt.ui.TabPanel = function() {  
	zxt.ui.Widget.call(this);
	
	this._tabpages = []; 
	this._select = null;
	
	this._openBehind = false;
      
	this._$jqBody = $("<div class='zxt-TabBody'>");	
	this._firstRender = true;
	this._tablePanel = new zxt.ui.TablePanel(3, 1);
	this._panelDom = this._tablePanel.render();	
	
	this._$tabTitle = {};
	this._$tabCell;
};

/**
 * 根据传入的DOM元素, 解析传入的相关属性, 创建相应的TAB组件
 *
 * @function
 * @static
 * @param {DOM} elem 解析的DOM元素
 * @return {ZxtModeGrid} 根据传入的DOM元素创建的TAB组件
 */
zxt.ui.TabPanel.parse = function(elem){
	var j = $(elem);
	var _instance = new zxt.ui.TabPanel();
	$(">div", j ).each( function( idx, dom )
		{
			var _id = $(dom).attr("zxt.label");
			var _title = $(dom).attr("zxt.title");			
			var _url = $(dom).attr("zxt.url");
			var _closeable = $(dom).attr("zxt.closeable");
			if(zxt.util.isAvailable(_url)){
				_instance._addURL( _id, _title, _url, _closeable);
			}else{
				_instance._addDOM( _id, _title,dom, _closeable);
			};
		}
	);
	
	return _instance;
};

zxt.defineClazz(zxt.ui.TabPanel, zxt.ui.Widget);

/**
 * 返回当前选中的Tab页面
 * @function
 * @return {zxt.ui.TabPage} 当前选中的Tab页面
 */
zxt.ui.TabPanel.prototype.current = function (){
	return this._select;
}	

/**
 * 新增TAB页是否隐藏
 * @function
 * @return {Boolean} true的话新增的Tab页将不会直接为选中页，false的话新增的tab页直接作为当前选中的tab页
 */
zxt.ui.TabPanel.prototype.openBehind = function (v){
	if(v===undefined){return this._openBehind;};
	this._openBehind = v;
};

/**
 * 增加一个TAB页面
 *
 * @function
 * @private
 * @param {string} label TAB页的标签
 * @param {string} [title] TAB页的标题
 * @param {string} dom TAB页的DOM节点
 * @param {boolean} closeable 是否可关闭
 */ 
zxt.ui.TabPanel.prototype._addDOM = function(label,title,dom,closeable){
	
	if ( !( zxt.util.isAvailable(label) && zxt.util.isAvailable(dom) && zxt.util.isAvailable(title) ) ){
		throw new Error("You must specify label, title and dom");
	}
		
	var page = new zxt.ui.TabPage(label, title, dom, closeable);	
	if( this._select == null ){
		this._select = page;
	}	
	
	this._tabpages.push(page);
	this._$jqBody.append(dom);
	
	/*if ( dom.parentNode ) {
		dom.parentNode.removeChild(dom);
	}*/
	return page;
};

/**
 * 传入DOM节点来增加一个TAB页面
 *
 * @function
 * @param {string} label TAB页的标签
 * @param {string} [title] TAB页的标题
 * @param {string} dom TAB页的DOM节点
 * @param {boolean} closeable 是否可关闭
 */ 
zxt.ui.TabPanel.prototype.addDOM = function(label,title,dom, closeable){
	var page = this._addDOM(label, title, dom, closeable);
	if(!this.openBehind()){
		this._select = page;
	};
	this.render();
};

/**
 * 传入URL增加一个TAB页面
 *
 * @function
 * @private
 * @param {string} label TAB页的标签
 * @param {string} url TAB页的URL地址
 * @param {string} [title] TAB页的标题
 * @param {boolean} closeable 是否可关闭
 */ 
zxt.ui.TabPanel.prototype._addURL = function(label,title,url, closeable){
	if ( !( zxt.util.isAvailable(label) && zxt.util.isAvailable(url) && zxt.util.isAvailable(title) ) ){
		throw new Error("You must specify label, title and url");
	}
	
	var container = $("<iframe frameborder='0' hspace='0' class='por-PopIFrame' width='100%' height='100%' scrolling='"+ zxt.cfg.TabPage.CSSScroll$Iframe +"'></iframe>");
	container.attr("src", url);
	container.get(0).TabLabel=label;
		
	var page = this.getTabPageByLabel(label);
	if ( zxt.util.notValue(page) ){
		page = new zxt.ui.TabPage(label, title, container.get(0), closeable);	
		if( this._select == null ){
			this._select = page;
		};		
		this._tabpages.push(page);
	} else {		
		page._title = title;
		page._dom.remove();
		page._dom = container;
		
	};	
	this._$jqBody.append(container.get(0));  	
	return page;
};

/**
 * 传入URL增加一个TAB页面
 *
 * @function
 * @param {string} label TAB页的标签
 * @param {string} url TAB页的URL地址
 * @param {string} [title] TAB页的标题
 * @param {boolean} closeable 是否可关闭
 */ 
zxt.ui.TabPanel.prototype.addURL = function(label,title,url, closeable){
	var page = this._addURL(label, title, url, closeable);
	if(!this.openBehind()){
		this._select = page;
	};
	this.render();
};

/**
 * 添加Tab页方法 TAB页为工程中的一个页面
 * @function
 * @param {string} label TAB页的标签 相当于Tab页的key值
 * @param {string} title TAB页的标题
 * @param {string} location 页面的位置
 * @param {string} page 页面名
 * @param {zxt.data.DataWrapper} data 页面传送的dw对象
 * @param {boolean} closeable 是否可关闭
 */
zxt.ui.TabPanel.prototype.addPage = function(label,title,location,page,data,closeable){
	if ( !( zxt.util.isAvailable(label) && zxt.util.isAvailable(location) && zxt.util.isAvailable(title) && zxt.util.isAvailable(page) && zxt.util.isAvailable(data)) ){
		throw new Error("You must specify label, title and location");
	}
	
	var id = zxt.util.GUID();
	
	var container = $("<iframe frameborder='0' hspace='0' class='por-PopIFrame' width='100%' height='100%' scrolling='"+ zxt.cfg.TabPage.CSSScroll$Iframe +"'></iframe>");
	container.attr("name",id);
	container.get(0).TabLabel=label;
	
	var _pg = this.getTabPageByLabel(label);
	if ( zxt.util.notValue(_pg) ){
		_pg = new zxt.ui.TabPage(label, title, container.get(0), closeable);	
		if( this._select == null ){
			this._select = _pg;
		};
		this._tabpages.push(_pg);
	} else {
		_pg._title = title;
		_pg._dom.remove();
		_pg._dom = container;
	};		
	
	this._$jqBody.append(container.get(0));
	if(!this.openBehind()){
		this._select = _pg;
	};
	this.render();
	$zxt.submit(data, location, page, "onInitialize", id);
};

/**
 * TAB的渲染函数
 *
 * @function
 * @return {DOM} 渲染成的DOM节点
 */
zxt.ui.TabPanel.prototype.renderSelf = function(){
	$(this._panelDom).height("100%");
	$(this._panelDom).width("100%");
	
	$(this._tablePanel.getCell(1, 0)).height("100%");
	
	$(this._tablePanel.getCell(0, 0)).empty();
	$(this._tablePanel.getCell(0, 0)).append(this._renderTitle());
	
	this._renderBody(this._$jqBody);
	
	if(this._firstRender){
		this._firstRender = false;
		$(this._tablePanel.getCell(1, 0)).append(this._$jqBody);
	};
	
	
	
	//$(this._tablePanel.getCell(1, 0)).empty();
	
	
	$(this._tablePanel.getCell(2, 0)).empty();
	$(this._tablePanel.getCell(2, 0)).append(this._renderBottom());
  return this._panelDom;
};

/**
 * TAB的标题渲染函数
 * @private
 * @function
 * @return {DOM} 渲染成的DOM节点
 */
zxt.ui.TabPanel.prototype._renderTitle = function(){
	var host = this; 
  var jqTabs = $("<div class='zxt-Tabs'>");

  $.each(this._tabpages, function(_idx, _page) {  	
  	var jqTab = $("<div class='zxt-Tab'>");		
		
		var jqTabC = $("<div class='zxt-TabC'></div>");	
		
		var jqTabCText=$("<div class='tabtxt'></div>").text(_page._title);
		if(_page._closeable){
			var jqTabCImg=$("<div class='tab-img'><div class='tabs-close'></div></div>");		
			jqTabCImg.click(function(){	host._removeTabPage(_page);	});
		};
		
		jqTabC.append(jqTabCText).append(jqTabCImg);
		
		
		var jqTabL = $("<div class='zxt-TabL'></div>");	
		var jqTabR = $("<div class='zxt-TabR'></div>");
		jqTab.append(jqTabL).append(jqTabC).append(jqTabR);
		
		jqTab.click( function(event) {host.tabClick(_page);} );
		jqTab.hover( function(){ host.tabHover(_page); }, function(){ host.tabHoverOut(_page); } );
		
		_page._titleLi = jqTab;
		if ( _page == host._select ){
			jqTab.addClass("zxt-TabCur").removeClass("zxt-Tab");
		} 	
		
		jqTabs.append(jqTab);

  });
  
  return jqTabs;
};

/**
 * TAB的标题名更改方法
 * @function
 * @param {string} label 需要更改TAB页的标签
 * @param {string} title 更改的TAB页的标题
 */
zxt.ui.TabPanel.prototype.changeTitle = function(label,title){
	$.each(this._tabpages, function(_idx, _page) { 
		if(_page._label==label){
			_page._title = title;
		};
	});
	this.render();
};

/**
 * TAB的底部渲染函数
 * @private
 * @function
 * @return {DOM} 渲染成的DOM节点
 */
zxt.ui.TabPanel.prototype._renderBottom = function(){	
	var jqBottom = $("<div class='zxt-TabBottom'><div class='zxt-TabBottomL'></div><div class='zxt-TabBottomR'></div></div>");
	return jqBottom;	
};	

/**
 * TAB的框架渲染函数
 * @private
 * @function
 * @return {DOM} 渲染成的DOM节点
 */
zxt.ui.TabPanel.prototype._renderBody = function(parent){
	//var host = this;
	$.each(this._tabpages, function(_idx, _page) {
		_page._dom.hide();
		/**		
		if ( _page == host._select ){
			_page._dom.show();
		} else {
			_page._dom.hide();
		}	**/	
		//parent.append( _page._dom );
	});
	
	this.showTab(this._select);
};

/**
 * 根据序号获得Tab页对象
 * @function
 * @param {int} idx 序号
 * @return {zxt.ui.TabPage} Tab页
 */
zxt.ui.TabPanel.prototype.getTabPageByIndex = function(idx){
	if ( idx >= this._tabpages.length )
		return null;
	
	return this._tabpages[idx];	
};

/**
 * 根据标签值获得Tab页对象
 * @function
 * @param {string} label Tab页标签
 * @return {zxt.ui.TabPage} Tab页
 */
zxt.ui.TabPanel.prototype.getTabPageByLabel = function(label){
	for( var i=0; i<this._tabpages.length; i++ ){
		var page = this._tabpages[i];
		if ( page._label == label ){
			return page;
		}	
	};	
	return null;
};

/**
 * 根据标签值获得Tab页对象 不存在的话返回-1
 * @private
 * @function
 * @param {string} label Tab页标签
 * @return {zxt.ui.TabPage} Tab页
 */
zxt.ui.TabPanel.prototype._getTabPageIndex = function(label){
	for( var i=0; i<this._tabpages.length; i++ ){
		var page = this._tabpages[i];
		if ( page._label == label ){
			return i;
		}	
	};	
	return -1;
};

/**
 * 显示TAB页
 * @function
 * @param {zxt.ui.TabPage} page 需要显示的Tab页
 */
zxt.ui.TabPanel.prototype.showTab = function(page){
	var old = this._select;
	if ( this._select ){
		this._select._titleLi.removeClass("zxt-TabCur").addClass("zxt-Tab");
		this._select._dom.hide();
	};
	
	this._select = page;
	
	this._select._titleLi.addClass("zxt-TabCur").removeClass("zxt-Tab");
	this._select._dom.show();	
	this.onShowTab(page, old);
};	

/**
 * 显示TAB页时触发的方法 由showTab方法调用
 * @interface
 * @function
 * @param {zxt.ui.TabPage} page 需要显示的Tab页
 * @param {zxt.ui.TabPage} old 原先的Tab页
 */
zxt.ui.TabPanel.prototype.onShowTab = function(page, old){
	
}	

/**
 * 根据标签值显示对应的Tab页对象
 * @function
 * @param {string} label Tab页标签
 */
zxt.ui.TabPanel.prototype.showTabByLabel = function(label){
	var _page = this.getTabPageByLabel(label);
	if ( _page == null ){
		throw new Error("Tab Page NOT Found [" + label);
	};	
	this.showTab(_page);
};

/**
 * 根据序号值显示对应的Tab页对象
 * @function
 * @param {string} label Tab页标签
 */
zxt.ui.TabPanel.prototype.showTabByIndex = function(idx){
	var _page = this.getTabPageByIndex(idx);
	if ( _page == null ){
		throw new Error("Tab Page NOT Found [" + label);
	};	
	this.showTab(_page);
};

/**
 * 删除对应的Tab页
 * @function
 * @private
 * @param {zxt.ui.TabPage} page Tab页对象
 */
zxt.ui.TabPanel.prototype._removeTabPage = function(page){	
	if (this._tabpages.length==1){
		return;
	}	
	
	page._titleLi.remove();
	page._dom.remove();
	
	var label = page._label;
	var index = -1;
	for( var i=0; i<this._tabpages.length; i++ ){
		var iPage = this._tabpages[i];
		if ( iPage._label == label ){
			index = i;
		}	
	};

	if ( index !=-1 ){
		this._tabpages.splice(index, 1);				
		if ( this._select._label == label ){
			var curr = index-1;
			if ( curr <0 ){
				curr = 0;
			}
			this.showTab( this._tabpages[curr] );
		}
	};	
	
};	

/**
 * 删除对应的Tab页
 * @function
 * @param {string} label 需要删除的Tab页的标签
 */
zxt.ui.TabPanel.prototype.removeTab = function(label){
	var _page = this.getTabPageByLabel(label);
	if ( _page == null ){
		throw new Error("Tab Page NOT Found [" + label);
	};
	
	this._removeTabPage(_page);
};	

/**
 * 删除所有的Tab页
 * @function
 */
zxt.ui.TabPanel.prototype.removeAllTab = function(){
	var i = this._tabpages.length;
	while(i!=0){
		i--;
		if(this._tabpages[i]._closeable){
			this._removeTabPage(this._tabpages[i]);
		};
	};
};

/**
 * TAB页单击的事件处理;
 * 可以重设该函数来定制事件逻辑;
 *
 * @event 
 */
zxt.ui.TabPanel.prototype.tabClick = function(page){
	this.showTab(page);
};


/**
 * TAB页鼠标移入的事件处理;
 * 可以重设该函数来定制事件逻辑;
 *
 * @event 
 */
zxt.ui.TabPanel.prototype.tabHover = function(page){
	//this.showTab(page);
};

/**
 * TAB页鼠标移出的事件处理;
 * 可以重设该函数来定制事件逻辑;
 *
 * @event 
 */
zxt.ui.TabPanel.prototype.tabHoverOut = function(page){
	
};


	



